home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / lib / python2.5 / logging / config.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-29  |  10KB  |  348 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. """
  5. Configuration functions for the logging package for Python. The core package
  6. is based on PEP 282 and comments thereto in comp.lang.python, and influenced
  7. by Apache's log4j system.
  8.  
  9. Should work under Python versions >= 1.5.2, except that source line
  10. information is not available unless 'sys._getframe()' is.
  11.  
  12. Copyright (C) 2001-2004 Vinay Sajip. All Rights Reserved.
  13.  
  14. To use, simply 'import logging' and log away!
  15. """
  16. import sys
  17. import logging
  18. import logging.handlers as logging
  19. import string
  20. import socket
  21. import struct
  22. import os
  23. import traceback
  24. import types
  25.  
  26. try:
  27.     import thread
  28.     import threading
  29. except ImportError:
  30.     thread = None
  31.  
  32. from SocketServer import ThreadingTCPServer, StreamRequestHandler
  33. DEFAULT_LOGGING_CONFIG_PORT = 9030
  34. if sys.platform == 'win32':
  35.     RESET_ERROR = 10054
  36. else:
  37.     RESET_ERROR = 104
  38. _listener = None
  39.  
  40. def fileConfig(fname, defaults = None):
  41.     '''
  42.     Read the logging configuration from a ConfigParser-format file.
  43.  
  44.     This can be called several times from an application, allowing an end user
  45.     the ability to select from various pre-canned configurations (if the
  46.     developer provides a mechanism to present the choices and load the chosen
  47.     configuration).
  48.     In versions of ConfigParser which have the readfp method [typically
  49.     shipped in 2.x versions of Python], you can pass in a file-like object
  50.     rather than a filename, in which case the file-like object will be read
  51.     using readfp.
  52.     '''
  53.     import ConfigParser as ConfigParser
  54.     cp = ConfigParser.ConfigParser(defaults)
  55.     if hasattr(cp, 'readfp') and hasattr(fname, 'readline'):
  56.         cp.readfp(fname)
  57.     else:
  58.         cp.read(fname)
  59.     formatters = _create_formatters(cp)
  60.     logging._acquireLock()
  61.     
  62.     try:
  63.         logging._handlers.clear()
  64.         del logging._handlerList[:]
  65.         handlers = _install_handlers(cp, formatters)
  66.         _install_loggers(cp, handlers)
  67.     finally:
  68.         logging._releaseLock()
  69.  
  70.  
  71.  
  72. def _resolve(name):
  73.     '''Resolve a dotted name to a global object.'''
  74.     name = string.split(name, '.')
  75.     used = name.pop(0)
  76.     found = __import__(used)
  77.     for n in name:
  78.         used = used + '.' + n
  79.         
  80.         try:
  81.             found = getattr(found, n)
  82.         continue
  83.         except AttributeError:
  84.             __import__(used)
  85.             found = getattr(found, n)
  86.             continue
  87.         
  88.  
  89.     
  90.     return found
  91.  
  92.  
  93. def _create_formatters(cp):
  94.     '''Create and return formatters'''
  95.     flist = cp.get('formatters', 'keys')
  96.     if not len(flist):
  97.         return { }
  98.     
  99.     flist = string.split(flist, ',')
  100.     formatters = { }
  101.     for form in flist:
  102.         sectname = 'formatter_%s' % string.strip(form)
  103.         opts = cp.options(sectname)
  104.         if 'format' in opts:
  105.             fs = cp.get(sectname, 'format', 1)
  106.         else:
  107.             fs = None
  108.         if 'datefmt' in opts:
  109.             dfs = cp.get(sectname, 'datefmt', 1)
  110.         else:
  111.             dfs = None
  112.         c = logging.Formatter
  113.         if 'class' in opts:
  114.             class_name = cp.get(sectname, 'class')
  115.             if class_name:
  116.                 c = _resolve(class_name)
  117.             
  118.         
  119.         f = c(fs, dfs)
  120.         formatters[form] = f
  121.     
  122.     return formatters
  123.  
  124.  
  125. def _install_handlers(cp, formatters):
  126.     '''Install and return handlers'''
  127.     hlist = cp.get('handlers', 'keys')
  128.     if not len(hlist):
  129.         return { }
  130.     
  131.     hlist = string.split(hlist, ',')
  132.     handlers = { }
  133.     fixups = []
  134.     for hand in hlist:
  135.         sectname = 'handler_%s' % string.strip(hand)
  136.         klass = cp.get(sectname, 'class')
  137.         opts = cp.options(sectname)
  138.         if 'formatter' in opts:
  139.             fmt = cp.get(sectname, 'formatter')
  140.         else:
  141.             fmt = ''
  142.         klass = eval(klass, vars(logging))
  143.         args = cp.get(sectname, 'args')
  144.         args = eval(args, vars(logging))
  145.         h = apply(klass, args)
  146.         if 'level' in opts:
  147.             level = cp.get(sectname, 'level')
  148.             h.setLevel(logging._levelNames[level])
  149.         
  150.         if len(fmt):
  151.             h.setFormatter(formatters[fmt])
  152.         
  153.         if klass == logging.handlers.MemoryHandler:
  154.             if 'target' in opts:
  155.                 target = cp.get(sectname, 'target')
  156.             else:
  157.                 target = ''
  158.             if len(target):
  159.                 fixups.append((h, target))
  160.             
  161.         
  162.         handlers[hand] = h
  163.     
  164.     for h, t in fixups:
  165.         h.setTarget(handlers[t])
  166.     
  167.     return handlers
  168.  
  169.  
  170. def _install_loggers(cp, handlers):
  171.     '''Create and install loggers'''
  172.     llist = cp.get('loggers', 'keys')
  173.     llist = string.split(llist, ',')
  174.     llist = map((lambda x: string.strip(x)), llist)
  175.     llist.remove('root')
  176.     sectname = 'logger_root'
  177.     root = logging.root
  178.     log = root
  179.     opts = cp.options(sectname)
  180.     if 'level' in opts:
  181.         level = cp.get(sectname, 'level')
  182.         log.setLevel(logging._levelNames[level])
  183.     
  184.     for h in root.handlers[:]:
  185.         root.removeHandler(h)
  186.     
  187.     hlist = cp.get(sectname, 'handlers')
  188.     if len(hlist):
  189.         hlist = string.split(hlist, ',')
  190.         for hand in hlist:
  191.             log.addHandler(handlers[string.strip(hand)])
  192.         
  193.     
  194.     existing = root.manager.loggerDict.keys()
  195.     for log in llist:
  196.         sectname = 'logger_%s' % log
  197.         qn = cp.get(sectname, 'qualname')
  198.         opts = cp.options(sectname)
  199.         if 'propagate' in opts:
  200.             propagate = cp.getint(sectname, 'propagate')
  201.         else:
  202.             propagate = 1
  203.         logger = logging.getLogger(qn)
  204.         if qn in existing:
  205.             existing.remove(qn)
  206.         
  207.         if 'level' in opts:
  208.             level = cp.get(sectname, 'level')
  209.             logger.setLevel(logging._levelNames[level])
  210.         
  211.         for h in logger.handlers[:]:
  212.             logger.removeHandler(h)
  213.         
  214.         logger.propagate = propagate
  215.         logger.disabled = 0
  216.         hlist = cp.get(sectname, 'handlers')
  217.         if len(hlist):
  218.             hlist = string.split(hlist, ',')
  219.             for hand in hlist:
  220.                 logger.addHandler(handlers[string.strip(hand)])
  221.             
  222.     
  223.     for log in existing:
  224.         root.manager.loggerDict[log].disabled = 1
  225.     
  226.  
  227.  
  228. def listen(port = DEFAULT_LOGGING_CONFIG_PORT):
  229.     '''
  230.     Start up a socket server on the specified port, and listen for new
  231.     configurations.
  232.  
  233.     These will be sent as a file suitable for processing by fileConfig().
  234.     Returns a Thread object on which you can call start() to start the server,
  235.     and which you can join() when appropriate. To stop the server, call
  236.     stopListening().
  237.     '''
  238.     if not thread:
  239.         raise NotImplementedError, 'listen() needs threading to work'
  240.     
  241.     
  242.     class ConfigStreamHandler(StreamRequestHandler):
  243.         '''
  244.         Handler for a logging configuration request.
  245.  
  246.         It expects a completely new logging configuration and uses fileConfig
  247.         to install it.
  248.         '''
  249.         
  250.         def handle(self):
  251.             '''
  252.             Handle a request.
  253.  
  254.             Each request is expected to be a 4-byte length, packed using
  255.             struct.pack(">L", n), followed by the config file.
  256.             Uses fileConfig() to do the grunt work.
  257.             '''
  258.             import tempfile as tempfile
  259.             
  260.             try:
  261.                 conn = self.connection
  262.                 chunk = conn.recv(4)
  263.                 if len(chunk) == 4:
  264.                     slen = struct.unpack('>L', chunk)[0]
  265.                     chunk = self.connection.recv(slen)
  266.                     while len(chunk) < slen:
  267.                         chunk = chunk + conn.recv(slen - len(chunk))
  268.                     file = tempfile.mktemp('.ini')
  269.                     f = open(file, 'w')
  270.                     f.write(chunk)
  271.                     f.close()
  272.                     
  273.                     try:
  274.                         fileConfig(file)
  275.                     except (KeyboardInterrupt, SystemExit):
  276.                         raise 
  277.                     except:
  278.                         traceback.print_exc()
  279.  
  280.                     os.remove(file)
  281.             except socket.error:
  282.                 e = None
  283.                 if type(e.args) != types.TupleType:
  284.                     raise 
  285.                 else:
  286.                     errcode = e.args[0]
  287.                     if errcode != RESET_ERROR:
  288.                         raise 
  289.                     
  290.             except:
  291.                 type(e.args) != types.TupleType
  292.  
  293.  
  294.  
  295.     
  296.     class ConfigSocketReceiver(ThreadingTCPServer):
  297.         '''
  298.         A simple TCP socket-based logging config receiver.
  299.         '''
  300.         allow_reuse_address = 1
  301.         
  302.         def __init__(self, host = 'localhost', port = DEFAULT_LOGGING_CONFIG_PORT, handler = None):
  303.             ThreadingTCPServer.__init__(self, (host, port), handler)
  304.             logging._acquireLock()
  305.             self.abort = 0
  306.             logging._releaseLock()
  307.             self.timeout = 1
  308.  
  309.         
  310.         def serve_until_stopped(self):
  311.             import select as select
  312.             abort = 0
  313.             while not abort:
  314.                 (rd, wr, ex) = select.select([
  315.                     self.socket.fileno()], [], [], self.timeout)
  316.                 if rd:
  317.                     self.handle_request()
  318.                 
  319.                 logging._acquireLock()
  320.                 abort = self.abort
  321.                 logging._releaseLock()
  322.  
  323.  
  324.     
  325.     def serve(rcvr, hdlr, port):
  326.         global _listener
  327.         server = rcvr(port = port, handler = hdlr)
  328.         logging._acquireLock()
  329.         _listener = server
  330.         logging._releaseLock()
  331.         server.serve_until_stopped()
  332.  
  333.     return threading.Thread(target = serve, args = (ConfigSocketReceiver, ConfigStreamHandler, port))
  334.  
  335.  
  336. def stopListening():
  337.     '''
  338.     Stop the listening server which was created with a call to listen().
  339.     '''
  340.     global _listener
  341.     if _listener:
  342.         logging._acquireLock()
  343.         _listener.abort = 1
  344.         _listener = None
  345.         logging._releaseLock()
  346.     
  347.  
  348.